package com.Java.train.common.controller;

import cn.hutool.core.util.StrUtil;
import com.Java.train.common.exception.BusniessException;
import com.Java.train.common.exception.BusniessExceptionEnum;
import com.Java.train.common.response.CommonResp;
//import com.Java.train.common.exception.BusinessException;
//import io.seata.core.context.RootContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * 统一异常处理、数据预处理等
 */
@ControllerAdvice
public class ControllerExceptionHandler {

    private static final Logger LOG = LoggerFactory.getLogger(ControllerExceptionHandler.class);

    /**
     * 所有异常统一处理
     * @param e
     * @return
     */
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public CommonResp exceptionHandler(Exception e) throws Exception{
//         LOG.info("seata全局事务ID: {}", RootContext.getXID());
//         // 如果是在一次全局事务里出异常了，就不要包装返回值，将异常抛给调用方，让调用方回滚事务
//         if (StrUtil.isNotBlank(RootContext.getXID())) {
//             throw e;
//         }
        CommonResp commonResp = new CommonResp();
        LOG.error("系统异常：", e);
        commonResp.setSuccess(false);
//        commonResp.setMessage("系统出现异常，请联系管理员");
        commonResp.setMessage("请联系管理员处理异常");
        return commonResp;
    }

    /**
     * 所有业务统一处理
     * @param e
     * @return
     */
    @ExceptionHandler(value = BusniessException.class)
    @ResponseBody
    public CommonResp exceptionHandler(BusniessException e) {
        CommonResp commonResp = new CommonResp();
        LOG.error("业务异常：{}", e.getE().getDesc());
        commonResp.setSuccess(false);
//        commonResp.setMessage("系统出现异常，请联系管理员");
        commonResp.setMessage(e.getE().getDesc());
        return commonResp;
    }

    /**
     * 所有校验统一处理
     * @param e
     * @return
     */
    @ExceptionHandler(value = BindException.class)
    @ResponseBody
    public CommonResp exceptionHandler(BindException e) {
        CommonResp commonResp = new CommonResp();
        LOG.error("校验异常：{}", e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
        commonResp.setSuccess(false);
//        commonResp.setMessage("系统出现异常，请联系管理员");
        commonResp.setMessage(e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
        return commonResp;
    }

}
